package com.fsmv.brainfuck2;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Ascii extends Activity implements OnTouchListener {
	Matrix matrix = new Matrix();
	Matrix savedMatrix = new Matrix();
	PointF start = new PointF();
	PointF mid = new PointF();
	
	float dist;
	float oldDist;
	
	static final int NONE = 0;
	static final int DRAG = 1;
	static final int ZOOM = 2;
	int mode = NONE;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ascii);
		ImageView view = (ImageView) findViewById(R.id.imageView);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		view.setOnTouchListener(this);
	}
	   
	@Override
	public boolean onTouch(View v, MotionEvent event) {
	   ImageView view = (ImageView) v;
	   
	   switch(event.getAction() & MotionEvent.ACTION_MASK){
	   case MotionEvent.ACTION_DOWN:
		   savedMatrix.set(matrix);
		   start.set(event.getX(), event.getY());
		   Log.d("tester:", "mode=DRAG");
		   mode=DRAG;
		   break;
	   case MotionEvent.ACTION_UP:
	   case MotionEvent.ACTION_POINTER_UP:
	      mode = NONE;
	      Log.d("Tester:", "mode=NONE" );
	      break;
	   case MotionEvent.ACTION_POINTER_DOWN:
		   oldDist = spacing(event);
		   Log.d("Tester", "oldDist=" + oldDist);
		   if (oldDist > 10f) {
		      savedMatrix.set(matrix);
		      midPoint(mid, event);
		      mode = ZOOM;
		      Log.d("Tester", "mode=ZOOM" );
		   }
		   break;
		case MotionEvent.ACTION_MOVE:
		   if (mode == DRAG) {
			   matrix.set(savedMatrix);
		       matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
		   }
		   else if (mode == ZOOM) {
		      float newDist = spacing(event);
		      Log.d("Tester:", "newDist=" + newDist);
		      if (newDist > 10f) {
		         matrix.set(savedMatrix);
		         float scale = newDist / oldDist;
		         matrix.postScale(scale, scale, mid.x, mid.y);
		      }
		   }
		   break;
	   }
	   
	   view.setImageMatrix(matrix);
	   
	   return true; // indicate event was handled
	}
	
	private float spacing(MotionEvent event) {
		float x = event.getX(0) - event.getX(1);
		float y = event.getY(0) - event.getY(1);
		return FloatMath.sqrt(x * x + y * y);
	}
	
	private void midPoint(PointF point, MotionEvent event) {
		float x = event.getX(0) + event.getX(1);
		float y = event.getY(0) + event.getY(1);
		point.set(x / 2, y / 2);
	}
}